linux 中的seat管理
·
Table of Contents
seat一般控制哪些设备
-
哪些设备属于一个 seat、由谁配置/控制,是掌握 Linux 图形会话、多用户、多终端安全模型的关键
-
Seat 管理的设备主要包括:GPU(DRM/KMS)、输入设备(键盘/鼠标/触摸屏等)、声音设备(可选)和串口/智能卡读卡器(高级场景)
-
这些设备的归属由 udev 规则标记,并由 systemd-logind 在运行时动态分配给活跃的图形会话(session)
-
图形设备 /dev/dri/card0, /dev/dri/renderD128 GPU,用于显示输出和硬件加速
-
输入设备 /dev/input/event* 键盘、鼠标、触摸板、触控屏、Tablet 等
-
TTY 控制台 /dev/tty0, /dev/tty1 ... 虚拟终端(VT),seat 通常绑定到一个 VT
-
音频设备(可选) /dev/snd/* 某些系统将声卡绑定到 seat(非强制)
-
其他外设(可选) /dev/ttyS0, /dev/usb/hiddev* 如串口、智能卡读卡器(企业/嵌入式场景)
-
⚠️ 注意:网络设备、存储设备(如 /dev/sda)不属于 seat,它们是全局共享的。
-
如果未设置 ID_SEAT,设备默认属于 seat0(主 seat)
-
/etc/udev/rules.d/99-seat1.rules
-
将特定 USB 键鼠绑定到 seat1
-
SUBSYSTEM=="input", ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", ENV{ID_SEAT}="seat1"
-
将特定 GPU 绑定到 seat1
-
SUBSYSTEM=="drm", KERNEL=="card1", ENV{ID_SEAT}="seat1"
# 列出所有 seats
loginctl list-seats
# 查看 seat0 的详细信息(含设备)
loginctl show-seat seat0 -p ActiveSession -p Devices
# 查看某个输入设备是否属于 seat0
udevadm info /dev/input/event4 | grep ID_SEAT
# 查看是否有 uaccess 标签
udevadm info /dev/dri/card0 | grep TAGS
# 输出应包含: :uaccess:
# 使用 loginctl 工具将一个设备永久地分配给一个特定的 Seat
loginctl attach [SEAT_ID] [DEVICE_SYSFS_PATH]
[SEAT_ID]: 你想分配到的 Seat 名称,例如 seat1。
[DEVICE_SYSFS_PATH]: 设备的 SysFS 路径,例如 /sys/devices/pci0000:00/.../drm/card1。
多seat控制管理
- 假设你有一台机器,接了两套显示器+键鼠:
- Seat0:主板 HDMI + 内置键盘 → 用户 A 登录 GNOME
- Seat1:PCIe 独立显卡 + USB 键鼠 → 用户 B 登录 Sway
- 你需要:
- 创建 udev 规则,将独显和 USB 设备标记为 ID_SEAT=seat1
- 启动两个图形会话(分别绑定到不同 TTY)
- systemd-logind 自动为每个 session 授权对应设备
- 此时:
- 用户 A 无法看到用户 B 的屏幕内容;
- 用户 B 的键盘不会影响用户 A;
- GPU 资源完全隔离。